<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<!-- 
    nodejs
    nodejs是一个基于chrome v8引擎的JavaScript运行环境
    nodejs可以让JS运行在服务端
    nodejs主要特征：单线程、非阻塞I/O、事件驱动

    npm是随着nodejs一起安装的包管理工具
    管理包的版本和依赖关系

    npm常用命令：
    npm init -y 初始化并生成package.json文件

    安装依赖包：

    1.本地安装依赖包
        1）项目依赖包
        npm install 包名 --save
        npm install 包名 -save
        npm install 包名 -S
        npm install 包名
        npm i 包名

        2）开发依赖包
        npm install 包名 --save-dev
        npm install 包名 -save-dev
        npm install 包名 -D
        npm i 包名 -D

    2.全局安装依赖包
    npm install 包名 --global
    npm i 包名 -g

    3.安装项目所有依赖包
    npm install
    npm i

    npm i vue 默认安装最新版的vue
    npm i vue@2 安装指定版本的vue
    npm i less sass vue 一次安装多个包

    npm uninstall 包名 -S 移除某个包
    npm uninstall 包名 -D 移除某个包

    npm update 包名 更新某个包

    npm cache clean --force 强制清除所有缓存
    npm cache clean 包名 清除某个包的缓存数据

    定义脚本命令
    "scripts":{
        "start": "node test.js abc",
        "build": "node test.js abc"
    }
    npm run start
    npm run build


    Yarn是另一种包管理工具
    Yarn是为解决早期npm的一些缺陷而出现的
    npm i yarn -g 全局安装yarn
    yarn init -y 初始化并生成package.json文件

    yarn add 包名 --save 安装项目依赖包
    yarn add 包名 -S 安装项目依赖包

    yarn add 包名 --dev 安装开发依赖包
    yarn add 包名 -D 安装开发依赖包

    yarn remove 包名 移除某个包
    yarn upgrade 包名 更新某个包

    yarn cache clean 清除缓存

    定义脚本命令
    "scripts":{
        "start": "node test.js abc",
        "build": "node test.js abc"
    }
    yarn run start
    yarn run build


    nrm是npm的源管理工具
    npm i nrm -g 全局安装nrm
    nrm ls 查看所有可选源
    nrm test 测试所有源的响应速度
    nrm use taobao 切换到taobao源


    在nodejs中执行js代码
    1.执行 node 命令，切换到node交互式环境
    2.执行 node xx.js 运行xx文件中的js代码


    Commonjs模块化规范
    Commonjs是nodejs使用的模块化规范（服务端的模块化规范）
    Commonjs是按照书写顺序依次执行（同步加载执行）
    Commonjs如果同一个模块加载多次，只执行一次
    let m1 = require('./module1.js');
    var m2 = require('./module2.js');// 第一次加载执行
    var m2 = require('./module2.js');// 第二次不执行

    每一个js文件中（模块内部）都有一个 module 对象
    module 对象有一个 exports 属性 是模块对外暴露的 内容/接口
    使用 require() 加载模块对外暴露的内容/接口

    module1.js 模块1
        let a = 123;
        let b = 456;
        module.exports = {a,b} // 外暴露的 内容/接口

    index.js 入口文件
        let module1 = require('./module1.js');// 加载模块对外暴露的内容/接口
        console.log(module1);// module.exports
        console.log(module1.a);// 123
        console.log(module1.b);// 456

 -->


<script>

let num = 123;
let str = 'abc';
let boo = true;
let und = undefined;
let nul = null;
let obj = {a:1};
let arr = [1,2];
let fun = function (){};
let set = new Set();
let map = new Map();
let sym = Symbol();

// 判断变量的具体数据类型
console.log( Object.prototype.toString.call(num) );
console.log( Object.prototype.toString.call(str) );
console.log( Object.prototype.toString.call(boo) );
console.log( Object.prototype.toString.call(und) );
console.log( Object.prototype.toString.call(nul) );
console.log( Object.prototype.toString.call(obj) );
console.log( Object.prototype.toString.call(arr) );
console.log( Object.prototype.toString.call(fun) );
console.log( Object.prototype.toString.call(set) );
console.log( Object.prototype.toString.call(map) );
console.log( Object.prototype.toString.call(sym) );

function Cat(){}
function Dog(){}
Dog.prototype = new Cat();
Dog.prototype.constructor = Dog;// 手动指正构造器
let dog1 = new Dog();
console.log( dog1.constructor );// ƒ Dog(){}

</script>
</body>
</html>